iT邦幫忙

2026 iThome 鐵人賽

DAY 22
0
Software Development

遠古聖遺物改造工程:遺留系統全面重構實務指南系列 第 22

[Day 22] 系統如何部署?應該使用甚麼工具部署?

  • 分享至 

  • xImage
  •  

系統如何部署?應該使用甚麼工具部署?

目標系統通過功能與整體測試後,還要放入可以長期運作的執行環境。部署方案會限制可採用的作業系統、封裝方式、相依項目及更新流程,也會影響故障後能否在允許時間內恢復。

選擇工具前,應該先確認部署位置、管理責任、停機限制與復原要求,再決定部署單位及工具組合。工具可以協助建立與執行方案,無法代替這些條件判斷。

先確認部署環境與限制

部署環境會在程式完成前影響技術選擇。目標系統使用的語言、框架與相依項目如果無法在指定環境中安裝、啟動或維護,即使功能測試已經通過,也不能形成可用的部署方案。

開始設計前,應該將環境限制記錄成可確認的條件:

確認面向 要回答的問題 應留下的結果
執行位置 目標系統要由哪一方提供及管理執行環境?是否能建立測試、預備與正式環境? 各環境的用途、管理責任及建立方式
作業系統與執行方式 可以使用哪些作業系統、執行階段與系統功能?版本支援期限為何? 支援版本、安裝條件及更新限制
輸入輸出與連線 系統需要使用哪些輸入輸出?如果包含網路互動,可以使用哪些通訊方式與連線範圍? 必要連線、連接埠、名稱解析及限制
執行資源 日常與尖峰情境需要多少處理、保存及傳輸能力?資源不足時如何處理? 初始配置、容量上限及調整方式
存取限制 哪些人員或自動流程可以建立、變更、啟動、停止及查閱部署結果? 角色、允許動作、核准方式及稽核要求
資料與規範 哪些資料可以進入該環境?是否有保存位置、加密、期限或稽核限制? 適用規則、禁止事項及確認責任者
維護能力 誰負責更新執行環境、處理故障與演練復原?可取得哪些支援? 維運責任、支援來源及處理時段

表格中的項目要按照實際系統刪減或補充。如果系統沒有網路互動,就不需要為它設計連線架構。如果系統不要求持續運作,也不必直接加入叢集(Cluster)或自動擴充機制。

將部署需求改寫成可驗收條件

「容易部署」或「具備高可用性」無法直接驗收。部署需求應該包含可觀察的情境、限制值與通過條件,讓候選方案可以使用相同基準比較。

需求面向 需要定義的內容 可檢查結果範例
停機限制 每次發布及非預期故障可以中斷多久?哪些時段可以執行變更? 發布操作在核准時段內完成,中斷時間沒有超過限制
發布頻率 預計多久發布一次?緊急修正需要多快完成? 從核准版本到完成部署的時間符合目標
可用性 如果系統需要持續運作,允許多少中斷?哪些功能必須優先恢復? 指定故障情境下仍可提供必要功能,或能在限制時間內恢復
擴充方式 哪些處理量變化已經確認?需要調整單一執行單位,還是增加相同單位? 在指定處理量下符合回應時間與錯誤比例
備份與資料復原 要保存哪些資料與設定?可以接受遺失多少變更? 備份可以在演練環境復原,復原後通過資料及功能檢查
災難復原 哪些環境失效情境需要處理?復原時間目標(Recovery Time Objective, RTO)與復原點目標(Recovery Point Objective, RPO)為何? 演練結果符合核准的 RTO 與 RPO
部署失敗處理 失敗時要停止、還原(Rollback)既有版本,還是完成向前修正(Roll Forward)? 每種失敗情境都有觸發條件、操作步驟與驗證結果

資料備份與版本還原處理不同問題。備份用來復原保存資料或設定,版本還原則把程式及相關設定切回已知可用狀態。兩者都要實際演練,不能因為已保留檔案或版本名稱就視為可以復原。

確認真正的部署單位

部署單位是可以獨立建置、版本化、啟動、停止及更換的程式集合。它不一定等同於程式碼中的模組,也不代表每個功能都要獨立部署。

部署單位 特性 適合評估的情況 主要代價
單一應用程式 所有功能隨同一版本一起建置及部署 功能規模可由同一執行流程承擔,而且共同更新不會造成無法接受的影響 任一變更都需要重新驗證及部署整體程式
模組化單體(Modular Monolith) 程式內部具有明確模組邊界,正式執行時仍是單一部署單位 希望保留模組責任,同時維持較簡單的部署與維運方式 模組仍共用發布時程與執行失敗範圍
多個服務 各服務可以獨立建置、部署及調整執行數量 已確認需要獨立發布、故障隔離或不同擴充方式 需要處理跨服務互動、版本相容、可觀測性及故障情境
背景工作 不依賴持續互動,可以按照事件、排程或人工指令執行 系統包含匯入、轉換、彙整或其他可獨立執行工作 需要定義重複執行、失敗重試、中止及執行結果保存方式

如果多個程式必須永遠一起發布、共同停止,而且無法獨立驗收,把它們拆成多個部署單位通常只會增加協調工作。相反地,已確認具有不同更新頻率、擴充需求或失敗範圍的項目,才適合評估獨立部署。分散式架構的判斷與互動設計會由後續章節繼續說明。

分清部署工具的責任層次

部署方案可能同時使用多種工具。虛擬化平臺建立隔離的執行環境,容器引擎負責建立及執行容器,容器編排工具維持多個容器化工作負載的預期狀態,自動化流程工具執行檢查與部署步驟,基礎設施即程式碼則描述並管理環境資源。

工具層次 主要管理對象 不會自動解決的問題
虛擬化平臺 虛擬機(Virtual Machine, VM)及其隔離環境 不會自動定義應用程式的建置、測試與發布規則
容器引擎 容器映像檔、容器、儲存空間及連線設定 不會自動提供跨多個執行位置的調度與高可用性
多容器定義工具 同一應用程式所需的多個容器與相依關係 不會因為使用多個容器就形成完整叢集管理能力
容器編排平臺 容器化工作負載的部署、調度、擴充及故障替換 不會建置原始碼,也不會自行決定持續整合與發布流程
持續整合與持續部署工具 由事件觸發的檢查、建置、核准與部署工作 不會替目標系統決定部署架構與驗收條件
基礎設施即程式碼工具 可由程式描述並管理的環境資源及其生命週期 不會保證每項變更都安全,也不會取代審查、備份與復原演練

先確認缺少的是哪一層能力,再加入相應工具。工具之間可以組合,但每多一層就會增加版本相容、更新、監控、存取限制與故障處理責任。

虛擬機管理工具

虛擬機適合需要完整作業系統隔離、既有執行方式難以容器化,或正式環境已經採用虛擬化管理流程的情境。選擇時要比較現有環境相容性、集中管理、備份、遷移、自動化介面、授權與支援方式。

工具 主要定位 適合評估的情況 導入前要確認的事項
VMware vSphere 與 vCenter vSphere 提供虛擬化平臺,vCenter 集中管理虛擬化資源、生命週期與可用性功能 正式環境已使用 VMware 技術,或需要集中管理多個虛擬化資源 版本相容、授權方案、支援期限、備份與復原、自動化介面及現有管理能力
Microsoft Hyper-V 在 Windows 執行環境建立及管理 Windows 或 Linux 虛擬機,並可與其他 Windows 管理功能整合 已有 Windows 虛擬化管理能力,且目標系統符合其支援條件 作業系統版本、來賓系統支援、集中管理方式、可用性設計、備份及復原程序
Proxmox Virtual Environment 整合 KVM 虛擬機、Linux 容器、網頁管理、叢集與災難復原功能 希望評估開放原始碼虛擬化平臺,並由維運人員管理完整環境生命週期 KVM 與 LXC 的適用界線、更新方式、支援來源、叢集需求、備份及復原能力

vCenter 是 vSphere 環境的集中管理元件,不能單獨視為所有虛擬機方案的共同工具。候選方案如果依賴特定管理平臺,概念驗證也要包含該平臺的建立、更新與復原流程。

容器與容器編排工具

容器(Container)將程式、必要相依項目及預設執行資訊封裝成可重複使用的映像檔。它可以減少環境差異,但仍要處理映像來源、更新、保存資料、連線、執行限制及敏感設定。

工具 工具層次與主要能力 適合評估的情況 導入前要確認的事項
Docker Engine 容器引擎,透過常駐程序、API 與命令列管理映像檔、容器、儲存空間及連線 需要成熟的容器工作流程與廣泛工具整合 支援平臺、常駐程序管理、無特權模式、映像來源、授權及更新方式
Podman 無常駐程序的容器引擎,可管理 Pod、容器與映像檔,並支援非特權執行 希望減少常駐管理程序,或需要配合 Linux 既有程序管理方式 正式環境支援、非特權執行限制、命令相容差異、遠端管理及周邊工具整合
Docker Compose 使用 Compose 檔案定義並啟動多容器應用程式 部署單位包含少量固定容器,而且可以由單一已知執行環境管理 正式環境支援方式、啟動順序、健康檢查、失敗重啟、保存資料及更新程序
Kubernetes 以宣告式設定管理容器化工作負載及服務,提供調度、擴充、故障替換與發布控制 已確認需要在叢集內調度工作負載、獨立擴充或自動維持預期狀態 叢集管理責任、版本升級、連線與保存方式、可觀測性、存取限制及故障處理能力

Docker Compose 與 Kubernetes 的管理範圍不同。Compose 適合描述多容器應用程式,Kubernetes 則持續調整工作負載,使實際狀態接近宣告狀態。容器數量少或不需要叢集能力時,Kubernetes 增加的控制元件與維運工作未必能帶來相應價值。

持續整合與持續部署工具

持續整合與持續部署(Continuous Integration and Continuous Deployment, CI/CD)工具可以把檢查、建置、測試與部署步驟寫成可重複執行的流程。本章只比較工具與部署環境的適配性,流程觸發、成品管理、核准與自動部署會由後續章節說明。

工具 主要定位 適合評估的情況 導入前要確認的事項
GitHub Actions 以儲存庫事件觸發工作流程,透過執行器(Runner)執行檢查、建置及部署工作 原始碼與協作流程已在 GitHub,並希望整合環境保護及部署紀錄 執行器位置、正式環境連線、環境核准、敏感設定、同時執行限制、費用及紀錄保存
GitLab CI/CD .gitlab-ci.yml 定義工作、階段與管線,並由 Runner 執行 原始碼與協作流程已在 GitLab,或需要配合 GitLab 的整合式管線管理 GitLab 提供方式、Runner 維護、正式環境連線、保護規則、敏感設定、費用及紀錄保存

GitHub 與 GitLab 是協作平臺,表格比較的是其中的 GitHub Actions 與 GitLab CI/CD。無論採用哪一項工具,執行器都要能在符合存取限制的前提下到達部署環境。把正式環境的廣泛存取能力長期放在一般建置流程中,會擴大流程遭誤用或受影響時的範圍。

基礎設施即程式碼工具

基礎設施即程式碼(Infrastructure as Code, IaC)以可版本化的程式或設定描述環境資源。它能讓建立與變更流程重複執行,也能在套用前顯示預計異動。採用 IaC 時,仍要管理狀態、敏感資訊、變更核准及工具本身的版本。

工具 主要定位 適合評估的情況 導入前要確認的事項
Terraform 使用 HashiCorp Configuration Language 描述資源,透過 Provider 建立計畫並管理生命週期與狀態 需要廣泛 Provider 生態系,並接受其設定語言與狀態管理方式 Provider 支援、版本與授權、狀態保存與鎖定、資源匯入、敏感資訊及失敗復原
OpenTofu 採用寫入、規劃與套用流程管理可重現的基礎設施,並延續相近的設定及 Provider 模型 希望評估由 Linux Foundation 管理的開放原始碼 IaC 選項 既有設定相容性、Provider 支援、版本升級、狀態保存與鎖定、維護來源及遷移程序
Pulumi 使用 TypeScript、Python、Go、.NET、Java 或 YAML 描述資源,由部署引擎計算變更 希望使用熟悉的程式語言、型別與測試工具建立可重用環境元件 語言與套件版本、狀態保存位置、Provider 支援、預覽與核准、敏感資訊及部署引擎維護方式

比較 IaC 工具時,不能只確認是否能建立第一個環境。還要以現有資源匯入、設定漂移、部分套用失敗、Provider 升級、狀態遺失及資源刪除等情境驗證生命週期。計畫畫面也需要人工或自動規則檢查,避免未預期的替換與刪除直接進入正式環境。

從限制推導工具組合

工具選擇應該能說明「哪一項限制導致哪一個決定」。下列情境只用來示範推導方式,不能直接當成所有系統的標準答案:

  • 如果正式環境已有受支援的虛擬化平臺,而且目標程式需要完整作業系統環境,可以先驗證虛擬機方案,不必先增加容器層。
  • 如果目標程式適合封裝成容器,而且只包含少量固定相依項目,可以比較 Docker Engine 或 Podman,並視多容器管理需要評估 Docker Compose。
  • 如果已確認多個部署單位需要在叢集內接受調度、獨立擴充及故障替換,可以評估 Kubernetes,並把叢集本身的維運成本納入方案。
  • 如果測試、預備與正式環境需要反覆建立相同資源,可以評估 IaC,並先確認目標平臺具有受支援的 Provider 或管理介面。
  • 如果發布頻率與稽核要求需要可重複流程,可以在既有協作平臺上評估 GitHub Actions 或 GitLab CI/CD,並限制執行器及部署環境的存取範圍。

程式語言、框架與資料保存方式也要回到部署限制重新檢查。候選技術必須能在指定作業系統與執行方式中受到支援,具備可接受的建置與啟動時間,並且能讓維運人員完成更新、觀察、備份及故障處理。如果系統包含資料庫、訊息系統或其他保存型相依項目,還要分別確認其部署、升級、一致性與復原方式。

透過概念驗證確認可行性

文件中的功能清單只能協助縮小候選範圍。高風險差異應該使用概念驗證(Proof of Concept, POC)取得實際結果。POC 可以選擇一個最小但完整的部署單位,完成下列工作:

  • 從乾淨環境按照已記錄步驟建立所需資源。
  • 建置並部署指定版本,確認成品、設定與環境可以對應。
  • 啟動程式並執行最小健康檢查及關鍵功能測試。
  • 模擬建置失敗、啟動失敗、更新中斷及相依項目暫時無法使用。
  • 執行版本還原或向前修正,並確認保存資料維持預期結果。
  • 記錄建立時間、部署時間、中斷時間、人工步驟、錯誤資訊與復原結果。
  • 由實際維運人員按照文件重新執行,確認操作與調查成本可以長期負擔。

POC 要使用正式方案會採用的關鍵元件與限制,但不需要先建置完整正式環境。驗證結果不符合門檻時,應該修改方案或選擇其他候選工具,不能只把失敗步驟留給正式部署時處理。

使用架構決策紀錄保存選擇

完成比較與 POC 後,使用架構決策紀錄(Architecture Decision Record, ADR)保存選擇,讓後續人員知道這項決定適用的條件及重新評估時機。

ADR 欄位 應記錄的內容
決策問題 要決定的部署單位、環境或工具層次
已確認限制 作業系統、停機、容量、資料、存取、規範與維運條件
候選方案 每個方案的組成、必要前提及不採用選項
比較結果 需求符合程度、POC 結果、成本、風險與維護責任
最後選擇 採用方案及它解決的具體問題
已知代價 新增的相依、管理工作、限制與待處理風險
重新評估條件 處理量、發布頻率、支援週期、故障情況或需求改變達到何種條件時重開決策

ADR 應該連回部署需求與 POC 結果。只寫「採用 Kubernetes」或「使用 Docker」無法說明工具為何適合,也無法在條件改變時判斷是否需要調整。

完成部署方案的檢查

進入實際部署流程前,可以使用下列問題確認方案:

  • 部署位置、作業系統、執行資源、輸入輸出、存取限制及規範要求是否已經確認?
  • 停機、發布頻率、可用性、擴充、備份、災難復原及失敗處理是否具有可驗收條件?
  • 每個部署單位是否能獨立建置、版本化、啟動、停止、更新及驗證?
  • 虛擬化、容器、多容器定義、容器編排、CI/CD 與 IaC 工具的責任是否已經分清?
  • 候選工具是否支援指定環境,並且具有可接受的更新、授權、支援及維護方式?
  • 執行器與自動化流程是否只取得完成工作所需的存取範圍?
  • 保存資料、設定與程式版本是否分別具有可執行的復原方式?
  • 高風險部署、更新及失敗情境是否已經完成 POC 並留下結果?
  • ADR 是否記錄限制、候選方案、取捨、維護責任及重新評估條件?

重點整理

  • 部署方案要先確認執行環境、管理責任、資料限制與維運能力,再將停機、可用性、擴充及復原需求改寫成可驗收條件。
  • 部署單位可能是單一應用程式、模組化單體、多個服務或背景工作。只有已確認獨立發布、擴充或故障範圍時,才需要增加獨立部署單位。
  • vSphere 與 vCenter、Hyper-V、Proxmox VE 提供不同的虛擬化管理方式,選擇時要配合現有環境、支援、授權及復原能力。
  • Docker Engine 與 Podman 是容器引擎,Docker Compose 負責描述多容器應用程式,Kubernetes 則管理容器化工作負載的預期狀態。
  • GitHub Actions 與 GitLab CI/CD 執行自動化流程,Terraform、OpenTofu 與 Pulumi 管理可由程式描述的環境資源。這些工具各自處理不同層次。
  • POC 應該驗證建立、部署、更新、失敗及復原情境,ADR 則保存限制、比較結果、最後選擇、已知代價與重新評估條件。

上一篇
[Day 21] 系統需要進行哪些測試?
系列文
遠古聖遺物改造工程:遺留系統全面重構實務指南22
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言